home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / System / Incognito / cdev / CControlPanel.cp next >
Text File  |  1994-02-09  |  6KB  |  315 lines

  1. #ifndef __FILES__
  2. #include <Files.h>
  3. #endif
  4.  
  5. #ifndef __FOLDERS__
  6. #include <Folders.h>
  7. #endif
  8.  
  9. #ifndef __DEVICES__
  10. #include <Devices.h>
  11. #endif
  12.  
  13. #ifndef __RESOURCES__
  14. #include <Resources.h>
  15. #endif
  16.  
  17. #ifndef __PLSTRINGFUNCS__
  18. #include <PLStringFuncs.h>
  19. #endif
  20.  
  21. #ifndef __DIALOGS__
  22. #include <Dialogs.h>
  23. #endif
  24.  
  25. #ifndef __DIALOGUTIL__
  26. #include <DialogUtil.h>
  27. #endif
  28.  
  29. #ifndef __TOOLUTILS__
  30. #include <ToolUtils.h>
  31. #endif
  32.  
  33. #ifndef __CCONTROLPANEL__
  34. #include "CControlPanel.h"
  35. #endif
  36.  
  37. #ifndef __CChooserDialog__
  38. #include "ChooserDialog.h"
  39. #endif
  40.  
  41.  
  42. long CControlPanel::DispatchMessage(short theMessage)
  43. {
  44.     long result = (long) this;
  45.     switch (theMessage)
  46.     {
  47.         case initDev:            // init dialog
  48.             result = DoInit();
  49.             break;
  50.         case hitDev:            // item hit
  51.             result = DoHit();
  52.             break;
  53.         case closeDev:            // cdev closed
  54.             result = DoClose();
  55.             break;
  56.         case nulDev:            // null event
  57.             break;
  58.         case updateDev:            // update stuff !updated by dialog
  59.             result = DoUpdate();
  60.             break;
  61.         case activDev:            // activating
  62.             result = DoActivate();
  63.             break;
  64.         case deactivDev:        // deactivating
  65.             result = DoDeactivate();
  66.             break;
  67.         case keyEvtDev:            // keydown
  68.             result = DoKey();
  69.             break;
  70.         case undoDev:            // undo chosen
  71.         case cutDev:            // cut chosen
  72.         case copyDev:            // copy chosen
  73.         case pasteDev:            // paste chosen
  74.         case clearDev:            // clear chosen
  75.         default:
  76.             break;
  77.     }
  78.     return result;
  79. }
  80.  
  81. #pragma segment Main
  82. CControlPanel::CControlPanel(short numItems)
  83. {
  84.     fNumItems = numItems;
  85. }
  86.  
  87.  
  88. #pragma segment Main
  89. CControlPanel::~CControlPanel()
  90. {
  91.     
  92. }
  93.  
  94.  
  95. #pragma segment Main
  96. void    CControlPanel::SetArguments(short item, EventRecord *theEvent, DialogPtr theDialog)
  97. {
  98.     fTheEvent = theEvent;
  99.     fItemHit = item - fNumItems;
  100.     fTheDialog = theDialog;
  101. }
  102.  
  103.  
  104. #pragma segment Main
  105. long    CControlPanel::DoInit()
  106. {
  107.     long    result = (long) this;
  108.     
  109.     fTheList = new CListManager(kListBox, fTheDialog);
  110.     if (fTheList) 
  111.     {
  112.         result = ReadPreferencesIntoList();
  113.     }
  114.     return result;
  115. }
  116.  
  117. #pragma segment Main
  118. long    CControlPanel::DoHit()
  119. {
  120.     long    result = (long) this;
  121.     
  122.     switch (fItemHit)
  123.     {
  124.         case kAddButton:
  125.         {
  126.             CChooserDialog    *theDialog;
  127.             
  128.             theDialog = new CChooserDialog();
  129.             if (theDialog)
  130.             {
  131.                 theDialog->Initialize(kChooseDialog);
  132.                 theDialog->SetChosenList(fTheList);
  133.                 theDialog->Run();
  134.                 delete theDialog;
  135.             }
  136.             break;
  137.         }
  138.         case kListBox:
  139.             fTheList->Click(fTheEvent->where, fTheEvent->modifiers);
  140.             hiliteItem(fTheDialog, kRemoveButton, fTheList->IsSelection() ? 0 : 255);
  141.             break;
  142.         case kRemoveButton:
  143.             fTheList->DeleteSelection();
  144.             hiliteItem(fTheDialog, kRemoveButton, 255);
  145.             break;
  146.         default:
  147.             break;
  148.     }
  149.     return result;
  150. }
  151.  
  152.  
  153. #pragma segment Main
  154. long    CControlPanel::DoClose()
  155. {
  156.     SavePreferences();
  157.     delete fTheList;
  158.     return (long) this;
  159. }
  160.  
  161.  
  162. #pragma segment Main
  163. long    CControlPanel::DoUpdate()
  164. {
  165.     DrawSmallFrame(fTheDialog, kListBox);
  166.     fTheList->Update();
  167.     return (long) this;
  168. }
  169.  
  170.  
  171. #pragma segment Main
  172. long    CControlPanel::DoActivate()
  173. {
  174.     hiliteItem(fTheDialog, kAddButton, 0);
  175.     hiliteItem(fTheDialog, kRemoveButton, fTheList->IsSelection() ? 0 : 255);
  176.     fTheList->Activate();
  177.     return (long) this;
  178. }
  179.  
  180.  
  181. #pragma segment Main
  182. long    CControlPanel::DoDeactivate()
  183. {
  184.     fTheList->Deactivate();
  185.     hiliteItem(fTheDialog, kAddButton, 255);
  186.     hiliteItem(fTheDialog, kRemoveButton, 255);
  187.     return (long)this;
  188. }
  189.  
  190.  
  191. #pragma segment Main
  192. long    CControlPanel::DoKey()
  193. {
  194.     Cell    theCell;
  195.     char    key = (char)(fTheEvent->message & charCodeMask);
  196.     if (key == 0x08)
  197.     fTheList->DeleteSelection();
  198.     return (long) this;
  199. }
  200.  
  201. #pragma segment Main
  202.  
  203.  
  204.  
  205. #pragma segment Main
  206. void CControlPanel::InsertItems()
  207. {
  208.     Handle            temp;
  209.     Str32            rName;
  210.     short            rID;
  211.     OSType            rType;
  212.     short            numTypes = Count1Resources('KILL');
  213.     
  214.     while (numTypes)
  215.     {
  216.         temp = Get1IndResource('KILL', numTypes);
  217.         if (temp)
  218.         {
  219.             GetResInfo(temp, &rID, &rType, rName);
  220.             ReleaseResource(temp);
  221.             fTheList->InsertItem(rName);
  222.         }
  223.         numTypes--;
  224.     }
  225. }
  226.  
  227. #pragma segment Main
  228. void CControlPanel::SavePreferences()
  229. {
  230.     Str32    theString;
  231.     short    refNum;
  232.     FSSpec    theFile;
  233.     Handle    theHandle = NewHandle(1);
  234.     long    result = (long) this;
  235.     Cell    theCell;
  236.     
  237.     FindFolder(-1, kPreferencesFolderType, true, &theFile.vRefNum, &theFile.parID);
  238.     GetIndString(theString, kPrefsName, 0);
  239.     if (!theString[0]) PLstrcpy(theFile.name, "\pIncognito Prefs");
  240.     else PLstrcpy(theFile.name, theString);
  241.     refNum = FSpOpenResFile(&theFile, fsRdWrPerm);
  242.     if (refNum == -1) return;
  243.     
  244.     RemovePreferences();
  245.     theCell.v = 0;
  246.     theCell.h = 0;
  247.     if (fTheList->GetFirstItem(theString, theCell))
  248.     do
  249.     {
  250.         AddResource(theHandle, 'KILL', theCell.v, theString);
  251.         WriteResource(theHandle);
  252.         DetachResource(theHandle);
  253.     } while (fTheList->GetNextItem(theString, theCell));
  254.     DisposeHandle(theHandle);
  255.     CloseResFile(refNum);
  256. }
  257.  
  258. #pragma segment Main
  259. void CControlPanel::RemovePreferences()
  260. {
  261.     Handle            temp;
  262.     Str32            rName;
  263.     short            rID;
  264.     OSType            rType;
  265.     short            numTypes = Count1Resources('KILL');
  266.     
  267.     while (numTypes)
  268.     {
  269.         temp = Get1IndResource('KILL', numTypes);
  270.         if (temp)
  271.         {
  272.             RemoveResource(temp);
  273.         }
  274.         numTypes--;
  275.     }
  276.     UpdateResFile(CurResFile());
  277. }
  278.  
  279.  
  280. #pragma segment Main
  281. long CControlPanel::ReadPreferencesIntoList(void)
  282. {
  283.     Str255    theString;
  284.     short    refNum;
  285.     FSSpec    theFile;
  286.     long    result = (long) this;
  287.     
  288.     FindFolder(-1, kPreferencesFolderType, true, &theFile.vRefNum, &theFile.parID);
  289.     GetIndString(theString, kPrefsName, 1);
  290.     if (!theString[0])
  291.     {
  292.         PLstrcpy(theFile.name, "\pIncognito Prefs");
  293.     }
  294.     PLstrcpy(theFile.name, theString);
  295.     refNum = FSpOpenResFile(&theFile, fsRdPerm);
  296.     if (refNum == -1)
  297.     {
  298.         FSpCreateResFile(&theFile, 'HEID', 'pref', 0);
  299.         refNum = FSpOpenResFile(&theFile, fsRdPerm);
  300.     }
  301.     if (refNum != -1)
  302.     {
  303.         InsertItems();
  304.         CloseResFile(refNum);
  305.     } else result = cdevResErr;
  306.     return result;
  307. }
  308.  
  309. #pragma segment Main
  310. void    CControlPanel::SetupDialog()
  311. {
  312.     
  313. }
  314.  
  315.